package com.iuie.ns.datum.service;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.iuie.ns.datum.vo.MthInstalmentDetailVO;
import com.iuie.ns.datum.vo.UserExpenseInfoVO;
import com.iuie.ns.datum.vo.UserExpenseInstalmentInfoVO;
import com.iuie.ns.datum.vo.UserExpenseStatisticInfoVO;
import com.iuie.ns.frame.web.dataset.vo.Page;

/**
 * 消费记录-service
 * @author liujie
 * @date 2018年4月6日下午5:50:25
 */
public interface IExpenseService {

	/**
	 * 分页查询
	 * @param condition
	 * @param page
	 * @return
	 * @date 2018年4月6日下午5:50:19
	 */
	List<UserExpenseInfoVO> findByPage(UserExpenseInfoVO condition, Page page);

	/**
	 * 保存单条记录
	 * @param item
	 * @param targetId 附件临时ID
	 * @throws IOException 
	 * @date 2018年4月6日下午5:50:36
	 */
	void addOne(UserExpenseInfoVO item, String targetId) throws IOException;

	/**
	 * 根据ID查询
	 * @param id
	 * @return
	 * @date 2018年4月6日下午5:56:36
	 */
	UserExpenseInfoVO findById(String id);

	/**
	 * 根据ID删除
	 * @param id
	 * @return
	 * @date 2018年4月7日下午10:13:51
	 */
	Integer deleteById(String id);

	/**
	 * 更新单条数据
	 * @param item
	 * @param id
	 * @param saveInstalmentDetail 
	 * @date 2018年4月7日下午10:42:11
	 */
	void updateOne(UserExpenseInfoVO item, String id, String saveInstalmentDetail);

	/**
	 * 查询消费统计信息
	 * @param condition
	 * @return
	 * @date 2018年4月14日下午4:40:02
	 */
	UserExpenseStatisticInfoVO findStatisticInfo(UserExpenseInfoVO condition);
	
	/**
	 * 批量新增分期详情信息
	 * @param item
	 * @date 2018年4月22日下午12:34:22
	 */
	void batchAddInstalmentRepayDetail(UserExpenseInfoVO item);
	
	/**
	 * 根据expenseid删除分期详情
	 * @param expenseId
	 * @return
	 * @date 2018年4月22日下午12:40:39
	 */
	Integer deleteByExpenseId(String expenseId);

	/**
	 * 根据消费ID查询所有分期信息
	 * @param expenseId
	 * @param page 
	 * @return
	 * @date 2018年4月22日下午3:45:52
	 */
	List<UserExpenseInstalmentInfoVO> findAllInstalmentDetails(String expenseId, Page page);

	/**
	 * 更新还款金额
	 * @param id
	 * @param repayAmount
	 * @date 2018年4月22日下午5:11:41
	 */
	void updateRepayAmount(String id, Double repayAmount);

	/**
	 * 更新备注
	 * @param id
	 * @param remark
	 * @date 2018年4月22日下午5:44:45
	 */
	void updateRemark(String id, String remark);

	/**
	 * 更新还款状态
	 * @param id
	 * @param isRepay
	 * @date 2018年4月22日下午5:57:10
	 */
	void updateRepayState(String id, String isRepay);
	
	/**
	 * 查询分期待还金额
	 * @param condition
	 * @return
	 * @date 2018年4月30日下午2:41:58
	 */
	Double findMthWaitRepayAmount(UserExpenseInfoVO condition);
	
	/**
	 * 查询分期已还金额
	 * @param condition
	 * @return
	 * @date 2018年4月30日下午2:42:15
	 */
	Double findMthHadRepayAmount(UserExpenseInfoVO condition);

	/**
	 * 更新实际还款日
	 * @param id
	 * @param realRepayDate
	 * @return
	 * @date 2018年4月30日下午4:11:51
	 */
	Integer updateRealRepayDate(String id, Date realRepayDate);

	/**
	 * 查询最近两个月的分期详情
	 * @param condition
	 * @param page
	 * @param date
	 * @return
	 * @date 2018年4月30日下午5:33:00
	 */
	List<MthInstalmentDetailVO> findMthInstalmentDetailByPage(MthInstalmentDetailVO condition, Page page, String date);
	
	/**
	 * 装载消费和报表数据（消费金额）
	 * @param params
	 * @param request
	 * @date 2018年5月22日下午12:32:44
	 */
	void loadConsumeSumReportData(Map<String, Object> params, HttpServletRequest request);
	
	/**
	 * 按天查询消费和报表数据（消费金额）
	 * @param categories
	 * @return
	 * @date 2018年5月23日上午9:45:26
	 */
	List<Double> findConsumeSumReportDataWithDay(List<String> categories);

	/**
	 * 按周查询消费和报表数据（消费金额）
	 * @param categories
	 * @return
	 * @date 2018年5月23日下午5:51:39
	 */
	List<Double> findConsumeSumReportDataWithWeek(List<String> categories);
	
	/**
	 * 按月查询消费和报表数据
	 * @param categories
	 * @return
	 * @date 2018年5月24日上午8:18:54
	 */
	List<Double> findConsumeSumReportDataWithMonth(List<String> categories);
	
	/**
	 * 装载消费类型报表数据（消费金额）
	 * @param params
	 * @param request
	 * @date 2018年5月24日下午2:50:53
	 */
	void loadConsumeTypeReportData(Map<String, Object> params, HttpServletRequest request);
	
	/**
	 * 装载消费渠道报表数据（消费金额）
	 * @param params
	 * @param request
	 */
	void loadConsumeChannelReportData(Map<String, Object> params, HttpServletRequest request);
	
	/**
	 * 装载消费类型的报表数据（数量统计）
	 * @param params
	 * @param request
	 */
	void loadConsumeTypeAccordCountReportData(Map<String, Object> params, HttpServletRequest request);
	
	/**
	 * 装载消费渠道的报表数据（数量统计）
	 * @param params
	 * @param request
	 */
	void loadConsumeChannelAccordCountReportData(Map<String, Object> params, HttpServletRequest request);

	/**
	 * 按消费类型查询报表（消费金额）
	 * @param startTime
	 * @param endTime
	 * @param userId
	 * @return
	 * @date 2018年5月25日上午8:01:58
	 */
	List<Map<String, String>> findConsumeTypeReportData(String startTime, String endTime, String userId);
	
	/**
	 * 按消费渠道查询报表（消费金额）
	 * @param startTime
	 * @param endTime
	 * @param userId
	 * @return
	 * @date 2018年5月25日上午8:53:36
	 */
	List<Map<String, String>> findConsumeChannelReportData(String startTime, String endTime, String userId);
	
	/**
	 * 查询消费渠道的报表数据（数量统计）
	 * @param startTime
	 * @param endTime
	 * @param userId
	 * @return
	 */
	List<Map<String, String>> findConsumeTypeAccordCountReportData(String startTime, String endTime, String userId);
}
